home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / music / gmsrc211.arj / SETUP.ASM < prev    next >
Assembly Source File  |  1994-03-13  |  10KB  |  502 lines

  1. ; Setup v1.01
  2. ;═══════════════════════════════════════════════════════════════════════════════
  3.  
  4. ideal
  5. P286
  6. model    Huge
  7. jumps
  8.  
  9. stack    256
  10.  
  11. segment MyCode
  12.  
  13.         assume    cs:MyCode,ds:MyData
  14.  
  15. PspAddress    dw    ?
  16. SizeOfProg      dw      ?
  17. TopOfData       dw      0
  18. GConfigFile    db    'GSETUP.CFG',0
  19. SetupScr        db      'SETUP.INF',0
  20. ScrHandle    dw    0
  21.  
  22. proc            Main
  23. Start:          mov     [cs:PspAddress],es
  24.                 mov     ax,zzzzzseg
  25.                 inc     ax
  26.                 mov     [cs:TopOfData],ax
  27.  
  28.                 mov     ax,MyData
  29.                 mov     ds,ax
  30.                 call    DetermineDisplay
  31.                 call    SetEnv
  32.                 call    SetMode
  33. @@LoadDriver:   mov     si,offset SetupScr
  34.                 call    PutName
  35.                 push    ds
  36.                 mov     dx,offset GDirectory
  37.                 mov     cx,seg GDirectory
  38.                 mov     ds,cx
  39.                 mov     ax,3D00h
  40.                 int     21h
  41.                 jb      @@NoFind
  42.                 mov     [cs:ScrHandle],ax
  43.                 mov     bx,ax
  44.                 call    GetDecodeSizes
  45.                 mov     ax,[cs:Screen]
  46.                 mov     es,ax
  47.                 mov     di,0
  48.                 mov     bx,[cs:ScrHandle]
  49.                 call    Decode
  50.                 mov     bx,[cs:ScrHandle]
  51.                 mov     ah,3Eh
  52.                 int     21h
  53.                 pop     ds
  54.                 jmp     @@ScrLoaded
  55. @@NoFind:       pop     ds
  56.                 mov     dx,offset NoScrFound
  57.                 call    Error
  58. @@ScrLoaded:    call    ReadGConfig
  59.         call    MainKey
  60. @@Exit:         call    RestoreMode
  61.                 call    Terminate
  62. endp            Main
  63.  
  64. UpLo        db    1,6,1,7,1,7,1,5,1,5,1,2
  65. XY        db    14,11,33,12,50,12,12,23,31,23,57,20
  66.  
  67. proc        WriteAll
  68.         mov    ax,[cs:Screen]
  69.         mov    es,ax
  70.         mov    si,offset GUSPort
  71.         mov    cx,6
  72.         mov    bx,0
  73. @@Looper:    xor    ah,ah
  74.         mov    al,[Byte cs:bx+XY+1]
  75.         mov    dx,160
  76.         mul    dx
  77.         xor    dh,dh
  78.         mov    dl,[cs:bx+XY]
  79.         add    ax,dx
  80.         add    ax,dx
  81.                 mov     di,ax
  82.         mov    ax,[cs:si]
  83.         add    al,'0'
  84.         mov    ah,15
  85.         stosw
  86.         add    bx,2
  87.         add    si,2
  88.         loop    @@Looper
  89.         ret
  90. endp            WriteAll
  91.  
  92. proc        UpcaseKey
  93.                 cmp     al,'a'
  94.                 jb      @@NoKey
  95.                 cmp     al,'z'
  96.                 ja      @@NoKey
  97.                 and     al,01011111b
  98. @@NoKey:        ret
  99. endp            UpcaseKey
  100.  
  101. macro        SetXY    X1, Y1
  102.         mov    ah,2
  103.         mov    bh,0
  104.         mov    dh,Y1
  105.         mov    dl,X1
  106.         int    10h
  107. endm        SetXY
  108.  
  109. proc        GetValue
  110.         shl    bx,1
  111.         push    bx
  112.         SetXY    [cs:bx+XY] [cs:bx+XY+1]
  113.         pop    bx
  114. @@KeyLoop:    mov    ah,0
  115.         int    16h
  116.         cmp    al,27
  117.         jnz    @@CheckRet
  118.         ret
  119. @@CheckRet:    cmp    al,13
  120.         jnz    @@CheckInside
  121.         ret
  122. @@CheckInside:    sub    al,'0'
  123.         cmp    al,[cs:bx+UpLo]
  124.         jb    @@KeyLoop
  125.         cmp    al,[cs:bx+UpLo+1]
  126.         ja    @@KeyLoop
  127.         mov    [cs:di],al
  128.         ret
  129. endp            GetValue
  130.  
  131. proc            MainKey
  132. @@KeyLoop:    call    WriteAll
  133.         SetXY    69 12
  134.         mov    ah,0
  135.         int    16h
  136.         call    UpcaseKey
  137.         cmp    ax,3B00h
  138.         jnz    @@TryLoad
  139.         call    WriteGConfig
  140.         jmp    @@KeyLoop
  141. @@TryLoad:    cmp    ax,3C00h
  142.         jnz    @@TryPort
  143.         call    ReadGConfig
  144.                 jmp     @@KeyLoop
  145. @@TryPort:      cmp     al,'P'
  146.         jnz    @@TryGF1
  147.         mov    di,offset GUSPort
  148.         mov    bx,0
  149.         call    GetValue
  150.         jmp    @@KeyLoop
  151. @@TryGF1:    cmp    al,'G'
  152.         jnz    @@TryMIDI
  153.         mov    di,offset GUSIRQ
  154.         mov    bx,1
  155.         call    GetValue
  156.         jmp    @@KeyLoop
  157. @@TryMIDI:    cmp    al,'M'
  158.         jnz    @@TryIn
  159.         mov    di,offset GUSMIDI
  160.         mov    bx,2
  161.         call    GetValue
  162.                 jmp     @@KeyLoop
  163. @@TryIn:    cmp    al,'I'
  164.         jnz    @@TryOut
  165.         mov    di,offset DMAIn
  166.         mov    bx,3
  167.         call    GetValue
  168.                 jmp     @@KeyLoop
  169. @@TryOut:    cmp    al,'O'
  170.         jnz    @@TryTerm
  171.         mov    di,offset DMAOut
  172.         mov    bx,4
  173.         call    GetValue
  174.                 jmp     @@KeyLoop
  175. @@TryTerm:    cmp    al,'T'
  176.         jnz    @@TryQuit
  177.         mov    di,offset TerminateFlag
  178.         mov    bx,5
  179.         call    GetValue
  180.                 jmp     @@KeyLoop
  181. @@TryQuit:    cmp    al,'Q'
  182.         jnz    @@KeyLoop
  183.         ret
  184. endp            MainKey
  185.  
  186. include         "env.asm"
  187.  
  188. OldMode     db    0
  189. CurMode     db    0
  190. Screen        dw    0B800h
  191.  
  192. proc            RestoreMode
  193.         xor    ah,ah
  194.         mov    al,[cs:OldMode]
  195.         int    10h
  196.         ret
  197. endp        RestoreMode
  198.  
  199. proc            SetMode near
  200.         xor    ah,ah
  201.         mov    al,[cs:CurMode]
  202.         int    10h
  203.         ret
  204. endp        SetMode
  205.  
  206. proc            DetermineDisplay near
  207.         mov    ax,0f00h
  208.         int    10h
  209.         mov    [cs:OldMode],al
  210.         cmp    al,7            ; Are we in monochrome mode?
  211.         jz    @@Monochrome
  212.         mov    [Word cs:Screen],0B800h
  213.         mov    [Byte cs:CurMode],3
  214.         ret
  215. @@Monochrome:    mov    [Word cs:Screen],0B000h
  216.         mov    [Byte cs:CurMode],7
  217.         ret
  218. endp        DetermineDisplay
  219.  
  220.  
  221. ;─────────────────────────────────────────────────────────────────────Decode────
  222. N       = 4096                  ; size of ring buffer
  223. F    = 18            ; upper limit for match_length
  224. THRESHOLD = 2            ; encode string into position and length
  225.                 ; if match_length is greater than this
  226.  
  227. flags    dw    0
  228. textbuf dw    0
  229.  
  230. ; bx - Handle
  231. ; cx - Num Bytes Long
  232. ; es:di - output
  233. textsize    dd    0
  234. codesize    dd    0
  235.  
  236. proc        GetDecodeSizes
  237.         push    ds bx
  238.         mov    ax,cs
  239.                 mov     ds,ax
  240.                 mov     ah,3Fh
  241.         mov    cx,8
  242.         mov    dx,offset textsize
  243.         int    21h
  244.         mov    si,[Word cs:textsize+2]
  245.         mov    di,[Word cs:textsize]
  246.         mov    dx,[Word cs:codesize+2]
  247.         mov    cx,[Word cs:codesize]
  248.         pop    bx ds
  249.         ret
  250. endp            GetDecodeSizes
  251.  
  252. proc            Decode
  253.         push    ds
  254.         mov    dx,[cs:TopOfData]
  255.         mov    [cs:textbuf],dx
  256.         add    dx,(N+F-1)/4+1
  257.  
  258.         mov    ds,dx        ; Load buffer
  259.         mov    dx,0
  260.         mov    ah,3Fh
  261.         int    21h
  262.         mov    si,0
  263.  
  264.         push    cx es
  265. ;               for (i = 0;i < N - F;i++) text_buf[i] = ' ';
  266.         mov    di,0
  267.         mov    ax,[cs:textbuf]
  268.         mov    es,ax
  269.         mov    cx,N-F
  270.         mov    al,' '
  271.         rep    stosb
  272.         pop    es cx
  273.         mov    di,0
  274.  
  275. ;        r = N - F; flags = 0;
  276.                 mov     [Word cs:flags],0
  277. ;         mov     [Word cs:r],N-F
  278.         mov    bx,N-F        ; R
  279. ;  for (;;)
  280. ;  {
  281. ;        if (((flags >>= 1) & 256) == 0)
  282. @@DecodeLoop:   shr     [Word cs:flags],1
  283.         mov    ax,[Word cs:flags]
  284.         and    ax,256
  285.         jnz    @@NextFlagCheck
  286.  
  287. ;        {
  288. ;          if ((c = getc(in)) == EOF) break;
  289.         lodsb
  290.         cmp    si,cx
  291.         jnb    @@Finish
  292. ;          flags = c | 0xff00;     /* uses higher byte cleverly to count eight */
  293.                 or      ah,0ffh
  294.         mov    [Word cs:flags],ax
  295. ;        }
  296. ;        if (flags & 1)
  297. @@NextFlagCheck:mov    ax,[cs:flags]
  298.         and    ax,1
  299.         jz    @@FlagCh2
  300. ;        {
  301. ;          if ((c = getc(in)) == EOF) break;
  302.         lodsb
  303.         cmp    si,cx
  304.         jg    @@Finish
  305. ;          putc(c, out); text_buf[r++] = c; r &= (N - 1);
  306.                 stosb
  307.         push    es
  308.         mov    es,[cs:textbuf]
  309.         mov    [es:bx],al
  310.         inc    bx
  311.         pop    es
  312.         and    bx,N-1
  313.         jmp    @@DecodeLoop
  314. ;        }
  315. ;        else
  316. ;        {
  317. ;          if ((i = getc(in)) == EOF) break;
  318. @@FlagCh2:    xor    ah,ah
  319.         lodsb
  320.         cmp    si,cx
  321.         jg    @@Finish
  322.                 mov     dx,ax                           ; i = DX
  323. ;          if ((j = getc(in)) == EOF) break;
  324.         lodsb                    ; j = AX
  325.         cmp    si,cx
  326.         jg    @@Finish
  327. ;                 i |= ((j & 0xf0) << 4);
  328.         push    ax
  329.         and    ax,0f0h
  330.         shl    ax,4
  331.         or    dx,ax
  332.         pop    ax
  333. ;          j = (j & 0x0f) + THRESHOLD;
  334.         and    ax,0fh
  335.         add    ax,THRESHOLD
  336. ;          for (k = 0;k <= j;k++)
  337.         mov    bp,0            ; k
  338. @@kloop:
  339.         push    ax            ; Save j
  340. ;                 {
  341. ;          c = text_buf[(i + k) & (N - 1)];
  342.         push    es bx
  343.         mov    es,[cs:textbuf]
  344.         mov    bx,dx            ; i
  345.         add    bx,bp            ; +k
  346.         and    bx,N-1
  347.         mov    al,[es:bx]
  348.         pop    bx es
  349. ;          putc(c, out);
  350.                 stosb
  351. ;          text_buf[r++] = c; r &= (N - 1);
  352.         push    es
  353.         mov    es,[cs:textbuf]
  354.         mov    [es:bx],al
  355.         inc    bx
  356.         pop    es
  357.                 and     bx,N-1
  358.         inc    bp            ; k++
  359.         pop    ax
  360.         cmp    bp,ax            ; k<=j
  361.         jle    @@kloop
  362.         jmp    @@DecodeLoop
  363. @@Finish:    pop    ds
  364.         ret
  365. endp            Decode
  366.  
  367. proc        Terminate far
  368.         mov    ax,4C00h
  369.         int    21h
  370. endp            Terminate
  371.  
  372. proc        Error near
  373.         call    RestoreMode
  374.                 mov     ax,MyData
  375.         mov    ds,ax
  376.         mov    ah,9
  377.                 int     21h
  378.         call    Terminate
  379. endp            Error
  380.  
  381. ; si - Filename offset
  382. proc            PutName
  383.         push    ds es
  384.         mov    ax,MyData
  385.                 mov     es,ax
  386.         mov    di,[es:PutFilename]
  387.         mov    ax,cs
  388.                 mov     ds,ax
  389.                 mov     cx,12
  390.         rep    movsb
  391.         mov    al,0
  392.         stosb
  393.         pop    es ds
  394.         ret
  395. endp            PutName
  396.  
  397. proc        WriteGConfig
  398.         push    ds
  399.         mov    ax,MyData
  400.         mov    ds,ax
  401.         mov    si,offset GConfigFile
  402.                 call    PutName
  403.         mov    dx,offset GDirectory
  404.                 mov     cx,seg GDirectory
  405.         mov    ds,cx
  406.         mov    cx,0
  407.         mov    ah,3Ch
  408.         int    21h
  409.         jb    @@NoWrite
  410.         push    ax
  411.         mov    ax,[cs:GUSPort]
  412.                 shl     ax,4
  413.                 add     ax,200h
  414.                 mov     [cs:GUSPort],ax
  415.                 mov     bx,[cs:GUSIRQ]
  416.                 mov     al,[cs:bx+GUSIRQList]
  417.                 mov     [Byte cs:GUSIRQ],al
  418.                 mov     bx,[cs:GUSMIDI]
  419.                 mov     al,[cs:bx+GUSIRQList]
  420.                 mov     [Byte cs:GUSMIDI],al
  421.                 dec     [Word cs:TerminateFlag]
  422.         pop    bx
  423.         mov    cx,11
  424.         mov    ax,cs
  425.         mov    ds,ax
  426.         mov    dx,offset GUSPort
  427.         mov    ah,40h
  428.                 int     21h
  429.         mov    ah,3Eh
  430.                 int     21h
  431.         mov    ax,[cs:GUSPort]
  432.         sub    ax,200h
  433.         shr    ax,4
  434.         mov    [cs:GUSPort],ax
  435.         mov    bx,[cs:GUSIRQ]
  436.         mov    al,[cs:bx+IRQGUSList]
  437.         mov    [Byte cs:GUSIRQ],al
  438.         mov    bx,[cs:GUSMIDI]
  439.         mov    al,[cs:bx+IRQGUSList]
  440.         mov    [Byte cs:GUSMIDI],al
  441.                 inc     [Word cs:TerminateFlag]
  442. @@NoWrite:      pop     ds
  443.         ret
  444. endp        WriteGConfig
  445.  
  446. proc        ReadGConfig
  447.         push    ds
  448.         mov    ax,MyData
  449.         mov    ds,ax
  450.         mov    si,offset GConfigFile
  451.         call    PutName
  452.         mov    dx,offset GDirectory
  453.                 mov     cx,seg GDirectory
  454.         mov    ds,cx
  455.         mov    ax,3D00h
  456.         int    21h
  457.         jb    @@NoRead
  458.         mov    bx,ax
  459.         mov    cx,11
  460.         mov    ax,cs
  461.         mov    ds,ax
  462.         mov    dx,offset GUSPort
  463.         mov    ax,3F00h
  464.                 int     21h
  465.         mov    ah,3Eh
  466.                 int     21h
  467.         mov    ax,[cs:GUSPort]
  468.         sub    ax,200h
  469.         shr    ax,4
  470.         mov    [cs:GUSPort],ax
  471.         mov    bx,[cs:GUSIRQ]
  472.         mov    al,[cs:bx+IRQGUSList]
  473.         mov    [Byte cs:GUSIRQ],al
  474.         mov    bx,[cs:GUSMIDI]
  475.         mov    al,[cs:bx+IRQGUSList]
  476.         mov    [Byte cs:GUSMIDI],al
  477.         inc    [Word cs:TerminateFlag]
  478. @@NoRead:       pop     ds
  479.         ret
  480. endp        ReadGConfig
  481.  
  482. IRQGUSList    db    0,0,1,2,0,3,0,4,0,0,0,5,6,0,0,7
  483.  
  484. ends            MyCode
  485.  
  486. segment MyData
  487. NoEnvFound    db    '1: The environment variable GUSMOD was not found.',13,10,'$'
  488. NoScrFound    db    '2: SETUP.INF not found.',13,10,'$'
  489.  
  490. GDirectory    db    80 dup (0)
  491. GEnv        db    6,"GUSMOD"
  492. PutFilename    dw    0
  493. ends    MyData
  494.  
  495. segment zzzzzseg
  496.     db    16 dup (?)
  497. ends    zzzzzseg
  498.  
  499.         end     Start
  500.  
  501.  
  502.